/*
 * @Copyright: (C) 2019 Zhang Rida. All rights reserved.
 *
 * @Author: Zhang Rida
 * @Email: 215154317@qq.com
 * @FilePath: /WEILA_SDK_MODULE/include/wlsdk.h
 * @Date: 2021-02-27 17:08:35
 * @Description:
 *
 * @LastEditors: Zhang Rida
 * @LastEditTime: 2022-08-17 16:42:33
 */
#ifndef _WLSDK_H
#define _WLSDK_H

#include "wlsdk_define.h"
/**
 * @description: 初始化模块
 * @param callback 消息回调
 * @param track_callback 日志输出回调
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_init(wlsdk_message_callback callback, wl_trace_callback trace_callback);

// /**
//  * @description: 初始化模块
//  * @param callback 消息回调
//  * @param track_callback 日志输出回调
//  * @param lock_callback 文件锁加锁回调
//  * @param unlock_callback 文件锁解锁回调
//  * @return 成功 0 失败 -1
//  */
// wl_int32 wlsdk_init_xip(wlsdk_message_callback callback,
//                         wl_trace_callback      trace_callback,
//                         wl_xip_callback        lock_callbck,
//                         wl_xip_callback        unlock_callback);

/**
 * @description: 释放模块
 * @param 无
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_end(void);

/**
 * @description: 日志开关
 * @param isopen 是否开启日志
 * @param level 日志等级 0 VERBOSE 1 INFO 2 DEBUG 3 WARN 4 ERROR (Release请关闭日志,正常调试使用WARN即可)
 * @return 成功 0 失败 -1
 */
void wlsdk_track_config(wl_bool isopen, wl_uint32 level);

/**
 * @description: 设置appkey(向微喇申请)
 * @param appid 应用id
 * @param appkey 应用key
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_set_appkey(wl_char* appid, wl_char* appkey);

/**
 * @description: 设置设备信息
 * @param id 产品ID
 * @param product 产品名称
 * @param imei 产品imei
 * @param imsi 卡imsi
 * @param version 版本
 * @param version_number 版本号(如果产品支持OTA,用于检查新版本)
 * @param firmware 固件版本信息
 * @param source_type 设备源类型 5 CF01 6 CF02
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_set_hardware(wl_char*  id,
                            wl_char*  product,
                            wl_char*  imei,
                            wl_char*  imsi,
                            wl_char*  version,
                            wl_uint32 version_number,
                            wl_char*  firmware,
                            wl_uint32 source_type);

/**
 * @description: 设置资源版本信息
 * @param version 版本
 * @param version_number 版本号(如果产品支持OTA,用于检查新版本)
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_set_resource_version(wl_char* version, wl_uint32 version_number);

/**
 * @description: 设置账号信息
 * @param account 账号
 * @param country_code 国家码(空或""表示account为微喇号,其他表示account为手机号)
 * @param password 密码
 * @param ismd5pwd 密码是否为MD5密文
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_set_account(wl_char* account, wl_char* country_code, wl_char* password, wl_bool ismd5pwd);

/**
 * @description: 设置网络
 * @param simid SIM卡ID
 * @param pdpid pdp context id
 * @param state 网络状态 参考wlsdk_system_network_state
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_set_network(wl_uint32 simid, wl_uint32 pdpid, wl_uint32 state);

/**
 * @description: 设置登录服务器url
 * @param url 服务器url
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_set_login_url(wl_char* url);

/**
 * @description: 设置web服务器地址
 * @param host 服务器主机
 * @param port 服务器端口
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_set_web_server(wl_char* host, wl_uint16 port);

/**
 * @description: 设置录音开始丢弃时长
 * @param duration 录音丢弃时长 单位ms
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_set_record_drop_duration(wl_uint32 duration);

/**
 * @description: 设置录音结束丢弃时长
 * @param duration 录音丢弃时长 单位ms
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_set_record_end_drop_duration(wl_uint32 duration);

/**
 * @description: 获取服务器连接状态
 * @param 无
 * @return 无
 */
wl_int32 wlsdk_get_server_state(void);

// login
/**
 * @description: 登录(设备按绑定方式登录,不输入账号密码)
 * @param 无
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_login(void);

/**
 * @description: 登出
 * @param 无
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_logout(void);

/**
 * @description: 设置voip自动接听
 * @param auto_accept 是否自动接听 0 不自动接听 1 自动接听(SDK默认收到来电振铃2秒后自动接听)
 * @param delay_ms 自动接听等待时间 auto_accept为1时有效 单位毫秒
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_set_voip_auto_accept(wl_bool auto_accept, wl_uint32 delay_ms);

/**
 * @description: 获取登录状态
 * @param 无
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_get_login_state(void);

/**
 * @description: 获取分机状态
 * @param 无
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_get_extension_state(void);

/**
 * @description: 设备绑定应答
 * @param status 0 忽略 1 accept 2 reject
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_answer_bind_extension(wl_uint32 status);

/**
 * @description: 获取登录用户信息
 * @param 无
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_get_selfinfo(void);

/**
 * @description: 获取用户配置信息
 * @param 无
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_get_user_config(void);

// session
/**
 * @description: 获取会话列表
 * @param 无
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_get_sessions(void);

/**
 * @description: 删除对讲会话
 * @param sessionid 会话id
 * @param sessiontype 会话类型
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_remove_session(wl_uint64 sessionid, wl_uint32 sessiontype);

/**
 * @description: 结束会话
 * @param sessionid 会话id
 * @param sessiontype 会话类型
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_close_session(wl_uint64 sessionid, wl_uint32 sessiontype);

/**
 * @description:
 * 设置对讲会话(只在用户手动切换会话时调用,该接口设置会话在个人会话空闲超时释放后会自动回到最后设置的群会话)
 * @param sessionid 会话id
 * @param sessiontype 会话类型
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_set_burst_session(wl_uint64 sessionid, wl_uint32 sessiontype);

/**
 * @description: 请求讲话
 * @param 无
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_session_burst_request(void);

/**
 * @description: 结束讲话
 * @param 无
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_session_burst_release(void);

/**
 * @description: 结束讲话语音丢弃(PTT按键释放时,IO直调,解决尾音录入按键释放音问题)
 * @param 无
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_session_burst_release_audio_drop(void);

/**
 * @description: 消息回放
 * @param 无
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_session_playback(void);

// group
/**
 * @description: 获取群组列表
 * @param 无
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_group_get_groups(void);

// friend
/**
 * @description: 获取好友列表
 * @param 无
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_friend_get_friends(void);

// tone
/**
 * @description: 播放音频
 * @param data 音频数据
 * @param datalen 音频数据长度
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_play_audio(wl_char* data, wl_uint32 datalen);

/**
 * @description: 播放pcm音频
 * @param data 音频数据
 * @param datalen 音频数据长度
 * @param rate 采样率 8000 16000
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_play_pcm(wl_char* data, wl_uint32 datalen, wl_uint32 rate);

/**
 * @description: 播放pcm音频(pcm会进行压缩,调用线程堆栈不小于20k)
 * @param data 音频数据
 * @param datalen 音频数据长度
 * @param rate 采样率 8000 16000
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_play_pcm_compress(wl_char* data, wl_uint32 datalen, wl_uint32 rate);

// location
/**
 * @description: 设置亿博源定位信息
 * @param content 定位信息需要解析
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_set_yby_location(wl_char* content);

/**
 * @description: 设置GPS位置
 * @param location 位置信息
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_set_gps_location(wlsdk_location* location);

/**
 * @description: 设置LBS定位信息
 * @param lbs  LBS信息
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_set_lbs_location(wlsdk_lbs* lbs);

// sos
/**
 * @description: 开启sos
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_open_sos(void);

/**
 * @description: 关闭sos
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_close_sos(void);

/**
 * @description: 检查新版本
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_check_version(void);

/**
 * @description: 电量告警
 * @param percent 电量 0~100
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_alarm_power(wl_int32 percent);

/**
 * @description: 电量更新
 * @param percent 电量 0~100
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_battery_update(wl_int32 percent);

/**
 * @description: 设置心跳间隔
 * @param interval 间隔时间(单位秒)
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_set_heartbeat_interval(wl_int32 interval);

/**
 * @description: 设置快速心跳
 * @param enable wl_true 开启 wl_false 关闭
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_set_fast_heartbeat(wl_bool enable);

/**
 * @description: 设置内存临界值
 * @param threshold 内存大小(单位字节,默认250*1024,内存低于该值超过三次会在设定时间重启,内存低于该值-50*1024会立即重启)
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_set_memory_threshold(wl_int32 threshold);

/**
 * @description: 设置内存告警重启时间
 * @param hour 重启时间(单位小时 0~23)
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_set_memory_alarm_reboot_hour(wl_int32 hour);

/**
 * @description: 暂停音频播放(用于音频冲突管理)
 * @param duration 持续时间(单位秒,到期自动恢复)
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_audio_pause(wl_int32 duration);

/**
 * @description: 恢复音频播放(用于音频冲突管理)
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_audio_resume(void);

/**
 * @description: VoIP邀请
 * @param userId 被叫用户Id
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_voip_invite(wl_uint32 userId);

/**
 * @description: VoIP邀请应答
 * @param userId 主叫用户Id
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_voip_accept(void);

/**
 * @description: VoIP挂断
 * @param userId 对方用户Id
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_voip_hangup(void);

/**
 * @description: 自定义按键按下
 * @param idx 按键编号 0 开始
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_button_press(wl_int32 idx);

/**
 * @description: 自定义按键松开
 * @param idx 按键编号 0 开始
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_button_release(wl_int32 idx);

/**
 * @description: 重启上报
 * @param memorty 重启前记录的内存
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_report_reboot(wl_int32 memory);

/**
 * @description: 重启modem上报
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_report_reset_modem(void);

/**
 * @description: ota状态
 * @param status 0 支持 1 不支持 系统默认支持
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_set_ota_status(wl_int32 status);

/**
 * @description: 设置临时会话静默保留时长
 * @param duration 间隔时间(单位秒)
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_set_tmp_session_keeptime(wl_int32 duration);

/**
 * @description: 会话切换
 * @return 成功 0 失败 -1
 */
wl_int32 wlsdk_burst_session_switch(void);

void wlsdk_set_PA_control_callback(wlsdk_enablePA callback);

#endif
